

package enterprise.jsf_jpa_war;

import enterprise.ent.Administradores;
import enterprise.ent.Country;
import enterprise.ent.Jugadores;
import enterprise.ent.Torneos;
import enterprise.ent.Usuarios;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;
import javax.transaction.NotSupportedException;
import javax.transaction.Transactional;
import javax.transaction.UserTransaction;
import org.primefaces.event.FileUploadEvent;  
import org.primefaces.model.UploadedFile;  

    
/**
 * <p>A simple managed bean to mediate between the user
 * and the persistence layer.</p>
 * @author rlubke
 */
@Named
public class bdcontrol {
    /**
     * <p>The <code>PersistenceContext</code>.</p>
     */
    @PersistenceContext 
    private EntityManager em;
    
    /**
     * <p>The transaction resource.</p>
     */
    @Resource 
    private UserTransaction utx;
    
    
    //variables Administradores
    public String adminNombre;
    public String adminApellidos;
    public String adminTelefono;
    public String adminDireccion;
    public String adminDireccion2;
    public String adminCpostal;
    public String adminPais;
    public String adminProvincia;
    public String adminLocalidad;
    public String adminUser;
    public String adminCargo;
    public String adminOrganizacion;
    public String adminDni;

    
    public String fPais;
    public String fProvincia;
    public String fLocalidad;
    
    public boolean ctrC;
    
    public List<Country> vListaPaises;
    public List<String> vListaProvincias;
    public List<String> vListaLocalidades;
    public List<String> vListaCpostales;

    public List<Country> getvListaPaises() {
        return vListaPaises;
    }

    public void setvListaPaises(List<Country> vListaPaises) {
        this.vListaPaises = vListaPaises;
    }

    public List<String> getvListaProvincias() {
        return vListaProvincias;
    }

    public void setvListaProvincias(List<String> vListaProvincias) {
        this.vListaProvincias = vListaProvincias;
    }

    public List<String> getvListaLocalidades() {
        return vListaLocalidades;
    }

    public void setvListaLocalidades(List<String> vListaLocalidades) {
        this.vListaLocalidades = vListaLocalidades;
    }

    public List<String> getvListaCpostales() {
        return vListaCpostales;
    }

    public void setvListaCpostales(List<String> vListaCpostales) {
        this.vListaCpostales = vListaCpostales;
    }
    
    
    
    public String getfLocalidad() {
        return fLocalidad;
    }

    public void setfLocalidad(String fLocalidad) {
        this.fLocalidad = fLocalidad;
    }

    public String getfProvincia() {
        return fProvincia;
    }

    public void setfProvincia(String fProvincia) {
        this.fProvincia = fProvincia;
    }

    public String getfPais() {
        return fPais;
    }

    public void setfPais(String fPais) {
        this.fPais = fPais;
    }
    
    public boolean isCtrC() {
        return ctrC;
    }

    public void setCtrC(boolean ctrC) {
        this.ctrC = ctrC;
    }
    
    public String getAdminNombre() {
        return adminNombre;
    }

    public void setAdminNombre(String adminNombre) {
        this.adminNombre = adminNombre;
    }

    public String getAdminApellidos() {
        return adminApellidos;
    }

    public void setAdminApellidos(String adminApellidos) {
        this.adminApellidos = adminApellidos;
    }

    public String getAdminTelefono() {
        return adminTelefono;
    }

    public void setAdminTelefono(String adminTelefono) {
        this.adminTelefono = adminTelefono;
    }

    public String getAdminDireccion() {
        return adminDireccion;
    }

    public void setAdminDireccion(String adminDireccion) {
        this.adminDireccion = adminDireccion;
    }

    public String getAdminDireccion2() {
        return adminDireccion2;
    }

    public void setAdminDireccion2(String adminDireccion2) {
        this.adminDireccion2 = adminDireccion2;
    }

    public String getAdminCpostal() {
        return adminCpostal;
    }

    public void setAdminCpostal(String adminCpostal) {
        this.adminCpostal = adminCpostal;
    }

    public String getAdminPais() {
        return adminPais;
    }

    public void setAdminPais(String adminPais) {
        this.adminPais = adminPais;
    }

    public String getAdminProvincia() {
        return adminProvincia;
    }

    public void setAdminProvincia(String adminProvincia) {
        this.adminProvincia = adminProvincia;
    }

    public String getAdminLocalidad() {
        return adminLocalidad;
    }

    public void setAdminLocalidad(String adminLocalidad) {
        this.adminLocalidad = adminLocalidad;
    }

    public String getAdminUser() {
        return adminUser;
    }

    public void setAdminUser(String adminUser) {
        this.adminUser = adminUser;
    }

    public String getAdminCargo() {
        return adminCargo;
    }

    public void setAdminCargo(String adminCargo) {
        this.adminCargo = adminCargo;
    }

    public String getAdminOrganizacion() {
        return adminOrganizacion;
    }

    public void setAdminOrganizacion(String adminOrganizacion) {
        this.adminOrganizacion = adminOrganizacion;
    }

    public String getAdminDni() {
        return adminDni;
    }

    public void setAdminDni(String adminDni) {
        this.adminDni = adminDni;
    }
    
    public void createAdmin(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        Administradores wadmin = new Administradores();
        System.out.println("pasa por el create de alta de admin!");
        wadmin.setAdminNombre(adminNombre);
        wadmin.setAdminApellidos(adminApellidos);
        wadmin.setAdminTelefono(adminTelefono);
        wadmin.setAdminDireccion(adminDireccion);
        wadmin.setAdminDireccion2(adminDireccion2);
        wadmin.setAdminCpostal(adminCpostal);
        wadmin.setAdminPais(adminPais);
        wadmin.setAdminProvincia(adminProvincia);
        wadmin.setAdminLocalidad(adminLocalidad);
        wadmin.setAdminAlta(new Date());
        wadmin.setAdminCargo(adminCargo);
        wadmin.setAdminOrganizacion(adminOrganizacion);
        wadmin.setAdminEstado(0);
        wadmin.setAdminDni(adminDni);
        
            try {
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                Usuarios usr = (Usuarios) sMap.get("user");
                Long IdCurrentUser = usr.getIdUsuario();
                System.out.println("usuario obtenido: " + IdCurrentUser);
                wadmin.setAdminUser(IdCurrentUser);
                
                utx.begin();
                em.persist(wadmin);
                utx.commit();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "#{msg.cuenta_admin_creada}", String.class)
                    ,null);
                context.addMessage("creategrowl", message);
                
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                BeanMenu bm = (BeanMenu) sMap.get("beanMenu");
                bm.esAdmin = true;
                bm.spagina = "torneo/creartorneo";
                
                //return "app-main";
                //return null;
            } catch (Exception e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating admin!",
                                                        "Unexpected error when creating your account.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new admin",
                                                e);
                //return null;
            }     
        }
   
    public void ActualizaPaises(){
        
        vListaPaises = findListadoPaises();
        adminPais = vListaPaises.get(0).getCode();
        ActualizaProvincias();
    }
    public void ActualizaProvincias(){
        
        vListaProvincias = findListadoProvincias();
        adminProvincia = this.vListaProvincias.get(0).toString();
        ActualizaLocalidades();
    }
    public void ActualizaLocalidades(){
        
        vListaLocalidades = findListadoLocalidades();
        adminLocalidad = this.vListaLocalidades.get(0).toString();
        ActualizaCpostales();
    }    
    public void ActualizaCpostales(){
        
        vListaCpostales = findListadoCpostales();
//        if(ctrC){
//            adminCpostal = vListaCpostales.get(0).toString();
//        }else{
//            adminCpostal = null;
//        }
    }    
    
    public List<Country> findListadoPaises() {
        Query query = em.createNamedQuery("Country.findPaisListado");
        //String paramLike = "%".concat(pbusqueda.concat("%"));
        //query.setParameter("pbusqueda", paramLike);
        List<Country> tmpCountry = query.getResultList();
        
        System.out.println("adminPais 1 ---------> " + adminPais);
        System.out.println("adminProvincia 1 ----> " + adminProvincia);
        System.out.println("adminLocalidad 1 ----> " + adminLocalidad);
        System.out.println("CPOSTALES 1 ----> " + adminCpostal);
//        System.out.println("fPais 1 ---------> " + fPais);
//        System.out.println("fProvincia 1 ----> " + fProvincia);
//        System.out.println("fLocalidad 1 ----> " + fLocalidad);
       
       
        
        return tmpCountry;
    }
    public List<String> findListadoProvincias() {
        
        System.out.println("adminPais 2 ---------> " + adminPais);
        System.out.println("adminProvincia 2 ----> " + adminProvincia);
        System.out.println("adminLocalidad 2 ----> " + adminLocalidad);
//        System.out.println("fPais 2 ---------> " + fPais);
//        System.out.println("fProvincia 2 ----> " + fProvincia);
//        System.out.println("fLocalidad 2 ----> " + fLocalidad);
        
        ctrC = true;
        Query query = em.createNamedQuery("Codigospostales.findProvincias");
        String paramLike = adminPais;
        System.out.println("pasa a rellenar provincias: " + adminPais);
        query.setParameter("pais", paramLike);
        List<String> tmpProvincias = query.getResultList();
        
        if(tmpProvincias.isEmpty()){
            ctrC = false;
            query = em.createNamedQuery("City.findDistrictByCountryCode");
            paramLike = adminPais;
            System.out.println("pasa a rellenar provincias2: " + adminPais);
            query.setParameter("countryCode", paramLike);
            tmpProvincias = query.getResultList();
        }   
            
        //adminProvincia = tmpProvincias.get(0).toString();
        return tmpProvincias;
    }
    public List<String> findListadoLocalidades() {
        
        System.out.println("adminPais 3 ---------> " + adminPais);
        System.out.println("adminProvincia 3 ----> " + adminProvincia);
        System.out.println("adminLocalidad 3 ----> " + adminLocalidad);
//        System.out.println("fPais 3 ---------> " + fPais);
//        System.out.println("fProvincia 3 ----> " + fProvincia);
//        System.out.println("fLocalidad 3 ----> " + fLocalidad);
        
        Query query;
        String paramLike;
        List<String> tmpLocalidades;
        if(ctrC){
            query = em.createNamedQuery("Codigospostales.findPoblaciones");
            query.setParameter("pais", adminPais);
            query.setParameter("provincia", adminProvincia);
            tmpLocalidades = query.getResultList();            
        }else{
            query = em.createNamedQuery("City.findByCCodeDistrict");
            paramLike = adminPais;
            System.out.println("pasa a rellenar localidades: " + adminPais + " --- " + adminProvincia);
            query.setParameter("countryCode", paramLike);
            paramLike = adminProvincia;
            query.setParameter("district", paramLike);
            tmpLocalidades = query.getResultList();
        }
        //adminLocalidad = tmpLocalidades.get(0).toString();
        return tmpLocalidades;
    }
    
    public List<String> findListadoCpostales() {
        
        System.out.println("adminPais 4 ---------> " + adminPais);
        System.out.println("adminProvincia 4 ----> " + adminProvincia);
        System.out.println("adminLocalidad 4 ----> " + adminLocalidad);

        //actualiza la variable para que el campo tenga el un valor por defecto (al final)
        Map sMap;
        sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        bdcontrol bm = (bdcontrol) sMap.get("bdcontrol");
        
       if(ctrC){
            List<String> tmpCpostales;
            Query query = em.createNamedQuery("Codigospostales.findCodigosPostales");
            query.setParameter("pais", adminPais);
            query.setParameter("provincia", adminProvincia);
            query.setParameter("poblacion", adminLocalidad);
            System.out.println("pais..> " + adminPais);
            System.out.println("provincia..> " + adminProvincia);
            System.out.println("poblacion..> " + adminLocalidad);
            tmpCpostales = query.getResultList(); 
            
            bm.adminCpostal = tmpCpostales.get(0).toString();
            return tmpCpostales;
        }else{
            bm.adminCpostal = "";
            return null;
        }
    }
    
    
    }
